为什么最后输出的结果是2

img


i=1在程序中是怎么循环的啊,i=1不应该只能执行case 1的语句吗,执行的话到底要执行几遍?

case 没有 break 会穿透 (fall through)继续向下执行, 首先 i = 1 进入 case 1 由于没有 break 继续向下执行,进入case 2 n++,没有break 继续向下,进入 case 3 n++,自增两次所以结果为 2。

进入符合条件的case就会一直执行直到 break 或者 switch 结束。

你看看这个 2.2 节 和 2.3 节

1.这里根本没有循环什么事,switch是分支,你可以把它看做一堆if,它只会从头到尾执行一次
2.case标签中没有break,所以会贯穿标签
代码确实匹配了case 1,但是因为case 1里没有break,所以会依次往下执行,直到switch结束或者遇到break为止
所以会连续执行两次n++

执行case1之后因为没有break,所以还会执行下边的 case2 case3,那n++就执行了两次,结果就是2了

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7547824
  • 除此之外, 这篇博客: 【动态规划】简单背包问题I,简单背包问题II,0-1背包问题(输出所选背包)中的 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 题目描述

    张琪曼和李旭琳在魔法石矿里挖到了很多的魔法石,她们有一个背包,可以放入的重量为S,现有N件魔法石,重量分别为W1,W2,W3,…,Wn,各重量均为正整数,从N件魔法石中挑选若干件,使得放入的背包的重量之和正好为S。若成功,则输出放入背包的物品,否则输出“Failed!”。

     

    输入

    第一行两个整数即S和N,其中S<1000,N<32。第二行为N个整数,即N件物品的重量。

     

    输出

    若成功,则输出放入背包的物品,以空格间隔,否则输出”Failed!”。

     

    复制样例数据

    10  5
    1   2   3   4  5

    样例输出

    1 4 5 
    #include <map>
    #include <set>
    #include <cmath>
    #include <queue>
    #include <stack>
    #include <cstdio>
    #include <string>
    #include <vector>
    #include <cstring>
    #include <iomanip>
    #include <iostream>
    #include <algorithm>
    #define inf 1000000007
    typedef long long ll;
    using namespace std;
    bool dp(int w, vector<int> &v, int sz)
    {
        if (w == 0)
            return true;
        else if (w < 0)
            return false;
        else
        {
            if (sz <= 0)
                return false;
            if ( dp(w-v[sz-1], v, sz-1) )
            {
                printf("%d ",v[sz-1]);//cout<<v[sz-1]<<' ';
                return true;
            }
            else
                return dp(w, v, sz-1);
        }
    }
    int main()
    {
        int w,n;
        scanf("%d%d",&w,&n);
        vector<int> v;
        int t;
        for(int i=0;i<n;i++){
                scanf("%d",&t);
            v.push_back(t);
        }
        int sz = v.size();
        if(dp(w,v,sz)==false)
            printf("Failed!");
            //cout<<"Failed"<<endl;
        return 0;
    }
    
    

    题目描述

    张琪曼:“为什么背包一定要完全装满呢?尽可能多装不就行了吗?”

    李旭琳:“你说得对,这和墨老师曾告诉我们的‘日中则昃,月满则亏’是一个道理。”所以,现在的问题是,她们有一个背包容量为v(正整数,0≤v≤20000),同时有n个魔法石(0≤n≤30),每个魔法石有一个体积 (正整数)。要求从n个魔法石中,任取若干个装入包内,使背包的剩余空间为最小。

     

    输入

    第一行为一个整数,表示背包容量,第二行为一个整数,表示有n个魔法石,接下来n行,分别表示这n个魔法石的各自体积。

     

    输出

    只有一个整数,表示背包剩余空间。

     

    复制样例数据

    24     
    6      
    8      
    3
    12
    7
    9
    7

    样例输出

    0
    #include <map>
    #include <set>
    #include <cmath>
    #include <queue>
    #include <stack>
    #include <cstdio>
    #include <string>
    #include <vector>
    #include <cstring>
    #include <iomanip>
    #include <iostream>
    #include <algorithm>
    #define inf 1000000007
    using namespace std;
    typedef long long ll;
    int dp[20010],s[40],rl,n;
    int main(){
        int i,j;
        scanf("%d%d",&rl,&n);
        for(i=1;i<=n;i++)
            scanf("%d",&s[i]);
        for(i=1;i<=n;i++)
            for(j=rl;j>=1;j--)
                if(j>=s[i])
                dp[j]=max(dp[j],dp[j-s[i]]+s[i]);
        printf("%d\n",rl-dp[rl]);
        return 0;
    }
    

    题目描述

    张琪曼和李旭琳有一个最多能用m公斤的背包,有n块魔法石,它们的重量分别是W1,W2,…,Wn,它们的价值分别为C1,C2,…,Cn。若每种魔法石只有一件,问能装入的最大总价值。

     

    输入

    第一行为两整数m和n,以下n行中,每行两个整数Wi,Ci,分别代表第i件物品的重量和价值。

     

    输出

    输出一整数,即最大价值。