标签:font 一个 += 题目 ace pac main pre 规划
5
1 2 3 9 100
5
1 2 4 9 100
5
1 2 4 7 100
7 8 15
#include<iostream> using namespace std; int main() { int n; while(cin>>n) { int a[105]={0}; int sum = 0; for(int i=0;i<n;i++) { cin>>a[i]; sum += a[i]; } int dp[10005]={0}; for(int i=0;i<n;i++) { for(int j=sum;j>=a[i];j--) { dp[j] = max(dp[j],dp[j-a[i]]+a[i]); } } int flag = 0; for(int i=1;i<=sum;i++) { if(dp[i]!=i) { flag = 1; cout<<i<<endl; break; } } if(!flag) //******** cout<<sum+1<<endl; } return 0; }
一道变向0/1背包问题
给你几个数 问你不能组合成的最小的数,组合成一个数,面对其中一个元素 无非就是选与不选 ,而01背包中dp[i]表示背包为i大小的时候 最大能装的价值
我们这道题dp[i]表示的是这个背包能组合成的最大的数,这个数不会超过i的大小,所以如果dp[i]==i则说明能够组合成这个数字。那么,如果dp[i]!=i的话
就是无法组成这个数。
将i从1到sum遍历一次 就能找到最小的 无法组合的数
注意:打*的代码容易忽略 我就wa了一发 如果从1到sum都能组成 那么最小不能组成的数就是sum+1了
标签:font 一个 += 题目 ace pac main pre 规划
原文地址:https://www.cnblogs.com/hao-tian/p/9427031.html